#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>

int main()
{
    while(1)
    {
        printf("hello world! my pid : %d\n", getpid());
        sleep(1);
    }

    return 0;

    // int a = 10;
    // int b = a / 0;
    // for(int i = 0; i < 135; i++)
    // {
    //     printf("%d : %s \n", i, strerror(i)); //输出错误码以及对应的错误描述信息
    // }

    // return 0;
    // printf("this is a test\n");
    // return 11;   
}

// void childRun()
// {
//     printf("I am Child : %d, My Father is %d\n",getpid(), getppid());
//     sleep(1);
// }

// int main()
// {
//     int processSize = 5;
//     for(int i = 0; i < processSize; i++)
//     {
//         pid_t id = fork();
//         if(id == 0)
//         {
//             childRun();
//             exit(1);
//         }
//     }

//     sleep(100);

//     return 0;
// }

// int main()
// {
//     char* str = "hello world";
//     str[0] = 'H';
//     return 0;
// }

// int g_val = 100;

// int main()
// {
//     int cnt = 3;
//     pid_t ret = fork();
//     if(ret == 0)
//     {
//         //child
//         while(1)
//         {
//             printf("I am child, my pid : %d, my ppid : % d, g_val = %d, &g_val = %p\n",getpid(), getppid(), g_val, &g_val);
//             sleep(1);
//             --cnt;
//             if(cnt == 0)
//             {
//                 g_val = 200;
//                 printf("child change g_val, 100->200\n");
//             }

//         }
//     }
//     else 
//     {
//         //parent
//         while(1)
//         {
//             printf("I am father, my pid : %d, my ppid : % d, g_val = %d, &g_val = %p\n",getpid(), getppid(), g_val, &g_val);
//             sleep(1);
//         }
//     }
//     return 0;
// }

// int g_val1 = 10; // 初始已化全局变量
// int g_val2;      // 未初始化全局变量

// int main(int argc, char* argv[], char* env[])
// {
//     printf("code addr : %p\n", main); // main函数地址位于代码区
//     char* str = "hello world";
//     printf("read only string addr : %p\n", str); //字符常量区
//     printf("init global addr : %p\n", &g_val1); //初始已化全局变量
//     printf("uninit global addr : %p\n", &g_val2); //未始已化全局变量
//     char* mem = (char*)malloc(20);  
//     char* mem2 = (char*)malloc(20);
//     char* mem3 = (char*)malloc(20); 
//     printf("heap addr : %p\n", mem); //堆区
//     printf("heap addr : %p\n", mem2); //堆区
//     printf("heap addr : %p\n", mem3); //堆区

//     printf("stack addr : %p\n", &str); //栈区
//     static int a;
//     int b,c;
//     printf("static int a addr : %p\n", &a); 
//     printf("stack addr : %p\n", &b); //栈区
//     printf("stack addr : %p\n", &c); //栈区

//     int i = 0;
//     for(; argv[i]; i++)
//         printf("argv[%d] -> %p\n", i, argv[i]);

//     for(i = 0; env[i]; i++)
//         printf("env[%d] -> %p\n", i, env[i]);

//     return 0;
// }

// int main(int argc, char* argv[])
// {
//     extern char** environ; // <unistd.h>
//     int i = 0;
//     for(; environ[i]; i++) 
//     {
//         printf("env[%d] -> %s\n", i, environ[i]);
//     }
//     sleep(30);
//     printf("change begin\n");
//     if(argc == 2)
//     {
//        chdir(argv[1]);
//     }

//     printf("change end\n");
//     sleep(30);
//     return 0;
// }

// int main(int argc, char* argv[], char* env[])
// {
//     int i = 0;
//     for(; env[i]; i++) // 当遍历到NULL时，循环结束，NULL本质就是0，0 本质就是 false
//     {
//         printf("env[%d] -> %s\n", i, env[i]);
//     }


//     // for(; argv[i]; i++) // 当遍历到NULL时，循环结束，NULL本质就是0，0 本质就是 false
//     // {
//     //     printf("argv[%d] -> %s\n", i, argv[i]);
//     // }

//     return 0;
// }

// int main(int argc, char* argv[])
// {
//     if(argc != 2)
//     {
//         printf("Usage: ./process -[a|b|c]\n");
//     }

//     if(strcmp(argv[1], "-a") == 0)
//     {
//         printf("逻辑1\n");
//     }
//     else if(strcmp(argv[1], "-b") == 0)
//     {
//         printf("逻辑2\n");
//     }
//     else if(strcmp(argv[1], "-c") == 0)
//     {
//         printf("逻辑3\n");
//     }
//     else 
//     {
//         printf("该参数不存在\n");
//     }

//     // for(int i = 0; i < argc; i++)
//     // {
//     //     printf("argv[%d] -> %s\n", i, argv[i]);
//     // }

//     return 0;
// }

// int main()
// {
//     char who[32];
//     strcpy(who, getenv("HOME"));

//     if(strcmp(who, "/root") == 0)
//     {
//         printf("我是root，我可以做任何事\n");
//     }
//     else
//     {
//         printf("我是普通用户，我受权限约束\n");
//     }

//     //printf("%s\n",getenv("PATH")); // 通过接口获取环境变量PATH的值
//     return 0;
// }

// int main()
// {
//     printf("这是一个进程，pid:%d,ppid:%d\n",getpid(),getppid());
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //子进程
//         while(1){
//             printf("我是子进程，pid:%d,ppid:%d\n",getpid(),getppid());
//             sleep(1);
//         }
//     }
//     else if(id > 0)
//     {
//         //父进程
//         while(1){
//             printf("我是父进程，pid:%d,ppid:%d\n",getpid(),getppid());
//             sleep(1);
//         }
//     }
//     else
//     {
//         //error
//     }



// //    while(1)
// //    {
// //        printf("我是一个进程:%d\n",getpid());
// //        sleep(1);
// //    }
// //
//     return 0;
// }

// int main()
// {
//     int i = 0;
//     while(i < 10)
//     {
//         printf("hello %d\n", i);
//         i++;
//     }
//     return 0;
// }

